#include<iostream>
#include<vector>
using namespace std;
const int maxn=1010;
int N;
vector<int> pre,mirror,inp,post;
struct node{
    int data;
    node* lchild=NULL;
    node* rchild=NULL;
};

node* newNode(int x){
    node* Node=new node;
    Node->data=x;
    return Node;
}
void insert(node* &root,int x){
    if(root==NULL){root=newNode(x);return;}
    if(root->data<=x){insert(root->rchild,x);}
    else if(root->data>x){insert(root->lchild,x);}
}

void preorder(node* root){
    if(root==NULL) return;
    pre.push_back(root->data);
    preorder(root->lchild);
    preorder(root->rchild);
}
void mirrororder(node* root){
    if(root==NULL) return;
    mirror.push_back(root->data);
    mirrororder(root->rchild);
    mirrororder(root->lchild);
}
void postorder(node* root){
    if(root==NULL)return;
    postorder(root->lchild);
    postorder(root->rchild);
    post.push_back(root->data);
}
void postmirrororder(node* root){
    if(root==NULL)return;
    postmirrororder(root->rchild);
    postmirrororder(root->lchild);
    post.push_back(root->data);
}
int main(){
    //freopen("in.txt","r",stdin);
    scanf("%d",&N);
    node* root=NULL;
    int x;
    for(int i=0;i<N;i++){
        scanf("%d",&x);
        insert(root,x);
        inp.push_back(x);
    }
    preorder(root);
    mirrororder(root);
    if(pre==inp){
        printf("YES\n");
        postorder(root);
        for(int i=0;i<post.size();i++){
            if(i==0){printf("%d",post[i]);}
            else printf(" %d",post[i]);
        }
    }
    else if(mirror==inp){
        printf("YES\n");
        postmirrororder(root);
        for(int i=0;i<post.size();i++){
            if(i==0){printf("%d",post[i]);}
            else printf(" %d",post[i]);
        }
    }
    else{
        printf("NO\n");
    }
}
